package com.zl.zsk.util;

import com.zl.zsk.pojo.SysMenu;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author lxb
 * @version 1.0.0
 * @desc:
 * @date 2020-03-27 10:22
 */
public class MenuUtil {
    /**
     * 仅适用与本系统，阅读困难可参照测试类 @see ZskApplicationTests
     *
     * @return
     */
    public static List<SysMenu> list2Tree(List<SysMenu> lists){
        List<Long> toRemove = new ArrayList<>();

        //分组 拿到所有有父节点的数据
        Map<Long, List<SysMenu>> collect = lists.stream().collect(Collectors.groupingBy(SysMenu::getParentId));

        SysMenu tmp = collect.get(0L).get(0);
        //递归，使父子节点成为树形结构，collect此时有个问题是：->
        //-> （根节点下的节点的子节点也会出现在map中，此时应该删除掉，因为第三级已经并到第二级的子节点字段中了，所以不应该在map的第一层直接出现）
        forEach(collect,tmp);

        //判断collect第一层的数据是否是可以删除掉的，即是否是第三级的数据
        collect.forEach((id,list)->{
            //0L是根节点
            if(id.compareTo(0L)!=0){
                collect.forEach((id2,list2)->{
                    if(id!=id2&&id2!=0){
                        list2.forEach(sysMenu -> {
                            if(sysMenu.getMenuId().compareTo(id)==0){
                                toRemove.add(id);
                            }
                        });
                    }
                });
            }
        });

        toRemove.forEach((id)-> collect.remove(id));

        List<SysMenu> sysMenus = new ArrayList<>();
        collect.forEach((id,list)-> list.forEach(sysMenu -> sysMenus.add(sysMenu)));
        return sysMenus;
    }

    private static void forEach(Map<Long,List<SysMenu>> collect,SysMenu sysMenu){
        List<SysMenu> treeNodes = collect.get(sysMenu.getMenuId());
        if(collect.get(sysMenu.getMenuId())!=null){
            treeNodes.stream().sorted(Comparator.comparing(SysMenu::getSort)).collect(Collectors.toList());
            sysMenu.setChildMenus(treeNodes);
            sysMenu.getChildMenus().forEach(t->forEach(collect,t));
        }
    }
}
